iT邦幫忙

2024 iThome 鐵人賽

DAY 13
1
Python

使用 WiFiBoy Python 玩學機來學物聯網應用 系列 第 13

13. 四位數七段顯示器應用

  • 分享至 

  • xImage
  •  

四位數七段顯示器工作原理介紹

玩學機四位七段顯示器學習套件採用的是 I2C 控制方式、控制晶片是使用 TM1650。

玩學機四位數七段顯示器照片:

正面

背面

銀行醫院叫號機、時鐘、溫度、磅秤儀表,都會看到這種元件的蹤影。有些每個位數有小數點,有的兩個數字之間還會有冒號,在選擇採購零件時要特別注意兩件事:

叫號機

電子時鐘

磅秤儀表

  1. 請依實際需求選擇適合的元件。如果您要做時鐘,最好選位數不帶小數點,兩數字間有冒號的版本。
  2. 請務必確認元件使用的驅動程式版本(TM1637、TM1650等)與控制方式(RS232、I2C等)。

TM1650 晶片簡介

技術規格

  • 工作電壓:
    支援的電壓工作範圍為 4.5 V 到 5.5V,一般是 5V。
  • 顯示控制:
    • TM1650 可以控制最多 16 個 LED,包括共陰極的 7 段數位顯示器和 8 個自行定義符號顯示。
    • 每個 LED 或每一段都可以獨立開關。
  • 顯示亮度:
    • 亮度控制支援 8 段調整,通過 PWM 來控制。
  • 通訊介面:
    • I2C 通訊介面,支援標準和快速模式。
    • 定址位址為地 0x24 至 0x27,是硬體設定決定。
  • 功耗:
    • 在正常工作狀態下,晶片功號相當低,小於2W。
  • 簡單的電路設計:
    • 整合了多種顯示驅動和控制功能,硬體製造業者要設計的控制電路變得更簡單,不需要額外的控制電路。
  • 省電模式:
    • 支援進入省電模式,可以滿足功耗要求較高的應用場景。

詳細的電路圖與介紹,可以參考去年鐵人賽我所編寫的文章

程式碼

顯示指定數字,顯示 1688

from machine import Pin, SoftI2C

i2c = SoftI2C(scl = Pin(22), sda = Pin(23))

d = bytearray(1)
brightness = 1

d[0] = brightness * 16 + 1          # xbbbbxxxd b = brightness d = on/off
i2c.writeto(0x24, d)                # 打開

digit = b'\x06\x7d\x7f\x7f'         # 七段數字顯示 1688
for i in range(4):
    d[0] = digit[i]
    i2c.writeto(0x34+i, d)          # 顯示四位數字

計數器程式

from machine import Pin, SoftI2C
i2c = SoftI2C(scl = Pin(22), sda = Pin(23))

# 顯示數值函數
def displayNum(num):
    d = bytearray(1)
    brightness = 1
    d[0] = brightness * 16 + 1          # xbbbbxxxd b = brightness d = on/off
    i2c.writeto(0x24, d)                # 打開
    digits = [0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F]
    numbers= [   0,    1,    2,    3,    4,    5,    6,    7,    8,    9]
    
    if num < 0:
        num = 0
    elif num > 9999:
        num = 9999
    number_to_display = [num // 1000 % 10, num // 100 % 10, num // 10 % 10, num % 10]
    digit_to_display = [digits[number_to_display[0]], digits[number_to_display[1]], digits[number_to_display[2]], digits[number_to_display[3]]]
    digit = bytes(digit_to_display)
    for i in range(4):
        d[0] = digit[i]
        i2c.writeto(0x34+i, d)          # 顯示四位數字

# 主程式
displayNum(0)     # 計數器預設顯示 0000
counter = 0		  # 設定計數器值

while True:
    wb.cls()
    wb.str('WiFiBoy Counter: ', 16, 20, 3, 1)
    key = wb.getkey()
    if key == 1:  # A 键
        counter += 1
        displayNum(counter)
    elif key == 2:  # B 键
        counter -= 1
        displayNum(counter)
    elif key == 64: # MENU 鍵
        counter = 0
        displayNum(counter)
    elif key == 32:
        wb.str('WiFiBoy Counter: Stop!', 16, 20, 3, 1)
        displayNum(counter)
        break
    wb.str(str(counter), 16, 64, 2, 5)
    time.sleep(0.2)  # 防止按鍵抖動,造成計數值誤差

執行照片

網路小時鐘

from machine import Pin, SoftI2C
import network, ntptime, time

# WiFi 設定
SSID = '更換成你家的 WiFi SSID'      # 更換成你家的 WiFi SSID
PASSWORD = '更換成你家的 WiFi 密碼'  # 更換成你家的 WiFi 密碼

# 連接 WiFi 程式
def connect_wifi():
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    wlan.connect(SSID, PASSWORD)
    while not wlan.isconnected():
        time.sleep(1)
    print("WiFi connected:", wlan.ifconfig())
# 取得網路時間
def get_network_time():
    retry_count = 5
    for _ in range(retry_count):
        try:
            ntptime.settime()
            tm = time.localtime()
            return tm[3], tm[4], tm[5]  # 返回小時、分鐘與秒數
        except OSError as e:
            print("Failed to get time, retrying...")
            time.sleep(2)  # 等待2秒後重試
    raise Exception("Failed to get network time after several attempts.")



i2c = SoftI2C(scl = Pin(22), sda = Pin(23))
# 顯示數值函數
def displayNum(num, colon_on):
    d = bytearray(1)
    brightness = 1
    d[0] = brightness * 16 + 1          # xbbbbxxxd b = brightness d = on/off
    i2c.writeto(0x24, d)                # 打開
    digits = [0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F]
    numbers= [   0,    1,    2,    3,    4,    5,    6,    7,    8,    9]
    
    if num < 0:
        num = 0
    elif num > 9999:
        num = 9999
    number_to_display = [num // 1000 % 10, num // 100 % 10, num // 10 % 10, num % 10]
    digit_to_display = [digits[number_to_display[0]], digits[number_to_display[1]], digits[number_to_display[2]], digits[number_to_display[3]]]
    # 在第二位數字後加入冒號(用於閃爍)
    if colon_on:
        digit_to_display[1] |= 0x80  # 0x80 用於顯示冒號
    
    digit = bytes(digit_to_display)
    for i in range(4):
        d[0] = digit[i]
        i2c.writeto(0x34+i, d)          # 顯示四位數字
# 取得時間函數
def getTime():
    hour, minute, second = get_network_time()
    time_to_display = (hour + 8) * 100 + minute
    colon_on = (second % 2 == 0)  # 每秒閃爍冒號
    displayNum(time_to_display, colon_on)

# 主程式
connect_wifi()
while True:
    getTime()
    time.sleep(1)  # 每秒鐘更新一次

參考資料

  1. 排隊叫號機
  2. 電子時鐘
  3. 電子磅秤

上一篇
12. LED 燈環擴充模組應用
下一篇
14. 連接 MAX7219 LED 矩陣顯示模組
系列文
使用 WiFiBoy Python 玩學機來學物聯網應用 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言